
package com.scott.itcast.thread.lesson08;

/**
 * 子线程循环10次，接着主线程循环100次
 * 接着又回到子线程循环10次，接着再回到主线程循环100次
 * 如此循环50次。请写出程序
 */
public class TraditionalThreadCommunication {

	public static void main(String[] args) {
		
		
		final Business business = new Business();
		//第1个线程
		new Thread(new Runnable(){
			public void run() {
				for(int i=1;i<=50;i++){
					business.sub(i);
				}
			}
			
		}).start();
		
		//第2个线程
		for(int i=1;i<=50;i++){
			business.main(i);
		}
		
		

	}
}

class Business{
	
	private boolean flag = true;
	
	
	public synchronized void sub(int i){
		
		//使用while可以消除 伪唤醒  spurious wakeup
		while(!flag){
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		for(int j=1; j<=10; j++){
			System.out.println("子线程" + j + " loop of "+i);
		}
		flag=false;
		
		//唤醒main线程
		this.notify();
		
		
	}

	public synchronized void main(int i){
		
		//使用while可以消除 伪唤醒  spurious wakeup
		while(flag){
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		for(int j=1; j<=100; j++){
			System.out.println("主线程" + j + " loop of "+i);
		}
		flag=true;
		
		//唤醒sub线程
		this.notify();
	}
}
